//
//  BaseCardTableViewController.swift
//  APP
//
//  Created by LXF on 2018/1/15.
//  Copyright © 2018年 Rdxer. All rights reserved.
//

import UIKit
import RxSwift
import DZNEmptyDataSet



/// 下拉刷新  tableViewController
open class XXBasePullDownTableViewController<ModelClass:AnyObject,CellClass:XXBaseTableViewCell<ModelClass>>: XXBaseTableViewController {
    
    
    open var dataList:[ModelClass] = []
    
    //********************************************************************************
    ///// 需要进行重写的   ⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
    /// 暂时弃用 ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
    /// 请重写 loadData
//
//    open func loadDataApiTarget()throws->APIType{
//        log.e("请实现此方法")
//        throw NSError.init(domain: "请实现此方法并且返回值", code: -1, userInfo: nil)
//    }
//
    //⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️
    //********************************************************************************
    
    // MARK: - prepareTableView
    open override func prepareTableView() {
        super.prepareTableView()
        
        tableView.tableFooterView = UIView.init()
        tableView.backgroundColor = FastComponentStyle.style.backgroundColor
        tableView.estimatedRowHeight = 100
        
        //        tableView.separatorInset = .init(top: <#T##CGFloat#>, left: <#T##CGFloat#>, bottom: <#T##CGFloat#>, right: <#T##CGFloat#>)
        //        tableView.separatorStyle = .none
        
        prepareEmptyDataSetView()
        registerCell()
        prepareRefreshHeaderIfNeed(tableView)
        startLoad()
    }
    
    open func startLoad(){
        emptyState = .loading
        loadData()
    }
    
    /// 如果自定义,请重写,否则使用范型类型 [注册 cell]
    open func needRegisterCells()->[String:CellClass.Type]{
        return [
            "cell":CellClass.self
        ]
    }
    open func registerCell(){
        needRegisterCells().forEach { (key,value) in
            tableView.register(value, forCellReuseIdentifier: key)
        }
    }
    
    open override func emptyDataSet(_ scrollView: UIScrollView, didTap: UIView) {
        startLoad()
    }

    // MARK: -
    // MARK: - loadData && loadMoreData
    
    //********************************************************************************
    ///// 需要进行重写的   ⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
    ///
    @objc open func loadData(){
        XXLoger.e("请实现此方法并且返回值")
//        throw NSError.init(domain: "请实现此方法并且返回值", code: -1, userInfo: nil)
//        self.resetDisposeBag()
//        let apiTarget = try! loadDataApiTarget()
//        api.rx.request(apiTarget)
////            .mapKidsModel(ModelClass.self)
//            .mapKidsModel([ModelClass].self)
//            .subscribe(onSuccess: {[weak self] (resp) in
//                self?.loadDataSucess(resp)
//            }) { [weak self](err) in
//                self?.loadDataError(err)
//            }.disposed(by: self)
        
    }
    
    //
    //⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️⤴️
    //********************************************************************************
    
    open func loadDataSucess(_ resp:[ModelClass]?){
        if let dataList = resp,
            dataList.count > 0
        {
            self.dataList = dataList

//            if dataList.count < NetConfig.page_size{
//                self.tableView.footer_safe?.endRefreshingWithNoMoreData()
//            }else{
//                self.tableView.footer_safe?.resetNoMoreData()
//            }
//        self.tableView.mj_footer
            self.tableView.footer_safe?.endRefreshingWithNoMoreData()
        }else{ ///  size == 0
            self.dataList = []
            self.tableView.footer_safe = nil // 移除
        }
        self.tableView.header_safe?.endRefreshing()
        self.emptyState = .empty
        self.tableView.reloadData()
    }
    
    open func loadDataError(_ err:Error){
        
        self.tableView.header_safe?.endRefreshing()
        self.emptyState = .requestFailed(msg:err.localizedDescription)
//
//        errHandle(err: err).subscribe(onSuccess: { [weak self] (suc) in
//            self?.emptyState = .requestFailed(msg:suc.msg)
//        }, onError: {[weak self] (err) in
//            self?.emptyState = .requestFailed(msg:nil)
//        }).disposed(by: self)
    }
    
    
    // MARK: -
    // MARK: - Table view data source
    open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataList.count
    }
    
    open func cellId(at model:ModelClass,indexPath:IndexPath,tableView: UITableView)->String{
        if let model = model as? XXCellIdProvideProtocol {
            return model.cellId(indexPath)
        }
        
        /// 如果没有多种 cell
        return "cell"
    }
    
    open override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let model = modelAt(indexPath)
        
        let cellid = cellId(at: model, indexPath: indexPath, tableView: tableView)
        
        let cell = tableView.dequeueReusableCell(withIdentifier: cellid, for: indexPath) as! CellClass
        
        
        cell.model = model
        
        prepareCell(cell: cell, model: model, tableView: tableView, indexPath: indexPath)
        
        return cell
    }
    
    /// 如果重写了 tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
    /// 则此方法不会自动调用
    open func prepareCell(cell:CellClass,model:ModelClass,tableView: UITableView,indexPath: IndexPath){
        
    }
    
    /// 获取模型
    open func modelAt(_ indexPath:IndexPath)->ModelClass{
        return dataList[indexPath.row]
    }
    
    /// 点击
    override open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        /// 点击动画实现
        tableView.deselectRow(at: indexPath, animated: true)
        
        let model = modelAt(indexPath)
        self.tableView(tableView, didSelectRowAt: indexPath, model: model)
    }
    
    /// cell 点击事件
    open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath,model:ModelClass) {
        
    }
}


